package main

import (
	"fmt"
	"github.com/panjf2000/ants/v2"
	"sync"
	"time"
)

func main() {
	start := time.Now()
	defer ants.Release()

	const (
		taskCount  = 1000      // 任务总数
		poolSize   = 100       // 工作池大小 限制并发数为 100
		resultSize = taskCount // 结果通道缓冲区大小
	)

	var (
		wg      sync.WaitGroup
		results = make(chan int, resultSize) // 结果通道
	)

	// 定义任务函数
	task := func(i interface{}) {
		defer wg.Done()
		n := i.(int)
		time.Sleep(10 * time.Millisecond) // 模拟耗时操作
		results <- n * 3                  // 将结果写入通道
	}

	// 创建 ants 池（带任务函数）
	pool, _ := ants.NewPoolWithFunc(poolSize, task) // 100 携程池
	defer pool.Release()
	// 提交任务到池
	for i := 0; i < taskCount; i++ {
		wg.Add(1)
		_ = pool.Invoke(i) // 任务函数参数 将参数 i 传递给任务函数
	}

	// 等待所有任务完成
	wg.Wait()
	close(results) // 关闭通道

	sum := 0
	for n := range results {
		fmt.Println(n)
		sum += n
	}
	end := time.Now()
	fmt.Println("  sum:", sum)
	//   sum: 1498500
	fmt.Println("  took:", end.Sub(start))
	//   took: 105.2428ms
}
